#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>

// 双向链表的结构

typedef int LTDataType ;

typedef struct ListNode
{

    LTDataType data ;

    struct ListNode* prev ;

    struct ListNode* next ;
    
} LTNode ;

// 双向链表的初始化
// void LTInit (LTNode** pphead) ;

LTNode* LTInit () ;

// 传二级指针,违背了接口的一致性

// void LTDestory (LTNode** pphead) ;

// 传一级: 在调用完成之后需要将实参手动置空(推荐)

void LTDestory (LTNode* phead) ;

// 头节点要发生改变,传二级指针

// 头结点不发生改变,传一级指针

// 双向链表的尾插

void LTPushBack (LTNode* phead , LTDataType x) ;

// 双向链表的尾删

void LTPopBack (LTNode* phead) ;

// 双向链表的头插

void LTPushFront (LTNode* phead , LTDataType x) ;

// 双向链表的头删

void LTPopFront (LTNode* phead) ;

// 双向链表pos位置之后插入数据

void LTInsert (LTNode* pos , LTDataType x) ;

// 双向链表指定位置之前插入数据

void LTInsertFront (LTNode* pos , LTDataType) ;

// 双向链表删除pos位置的节点

void LTErase (LTNode* pos) ;

// 查找双向链表指定节点

LTNode* LTFint (LTNode* phead , LTDataType x) ;

// 判断双向链表是否为空

bool LTEmpty (LTNode* phead) ;

// 双向链表的打印

void LTPrint (LTNode* phead) ;